package br.com.gip.repository.dao;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import br.com.gip.repository.model.Artefato;
import br.com.gip.repository.model.Relacionamento;
import br.com.gip.repository.persistence.HibernateDao;

@Repository
@Transactional
public class RelacionamentoDao extends HibernateDao<Relacionamento, Long> {

	private static final long serialVersionUID = -5481664485697304224L;

	@SuppressWarnings("unchecked")
	public List<Artefato> findDependentes(Artefato artefato) {
		List<Artefato> dependentes = new ArrayList<Artefato>();
		
		Criteria criteria = this.getCurrentSession().createCriteria(Relacionamento.class, "r");
		criteria.add(Restrictions.or(Restrictions.eq("origem.id", artefato.getArtefatoId()), Restrictions.eq("destino.id", artefato.getArtefatoId())));
		List<Relacionamento> relacionamentos = criteria.list();
		
		for (Relacionamento relacionamento : relacionamentos) {
			if (!relacionamento.getOrigem().equals(artefato)) {
				if (!dependentes.contains(relacionamento.getOrigem())) {
					dependentes.add(relacionamento.getOrigem());
				}
			}
			
			if (!relacionamento.getDestino().equals(artefato)) {
				if (!dependentes.contains(relacionamento.getDestino())) {
					dependentes.add(relacionamento.getDestino());
				}
			}
		}
		
		return dependentes;
	}

	@SuppressWarnings("unchecked")
	public List<Relacionamento> findRelacionamentos(String nome, Long categoriaId, Long projetoId) {
		this.getCurrentSession().clear();
		
		StringBuilder query = new StringBuilder("Select r From Relacionamento r "); 
		
		if (!StringUtils.isBlank(nome)) {
			query.append("origem.nome = '" + nome + "' ");	
		}
		
		if (categoriaId != null && categoriaId > 0) {
			query.append("origem.categoria.categoriaId = " + categoriaId + " ");
		}
		
		if (projetoId != null && projetoId > 0) {
			query.append("origem.projeto.projetoId = " + projetoId);
		}
		
		return (List<Relacionamento>) this.getCurrentSession().createQuery(query.toString()).list();
	}
	
	
	@SuppressWarnings("unchecked")
	public List<Relacionamento> findRelacionamentos(Artefato artefato) {
		Criteria criteria = this.getCurrentSession().createCriteria(Relacionamento.class, "r");
		criteria.add(Restrictions.or(Restrictions.eq("origem.id", artefato.getArtefatoId()), Restrictions.eq("destino.id", artefato.getArtefatoId())));	
		return (List<Relacionamento>) criteria.list();
	}
	
	
}